package com.iteaj.util.json;

import java.math.BigDecimal;
import java.util.Date;
import java.util.Optional;

/**
 * create time: 2018/3/29
 *  关于参数isThrow的说明 <br>
 *      1. 如果字段不存在是否要抛出异常<br>
 *      2. 如果字段值为Null是否要抛出异常
 * @author iteaj
 * @version 1.0
 * @since 1.7
 */
public interface Json {

    /**
     * 返回适配的Json库类型
     * @return
     */
    Type getType();

    /**
     * 返回存储Json数据的真正对象
     * @see com.fasterxml.jackson.databind.JsonNode
     * @see com.alibaba.fastjson.JSON
     * @return
     */
    Object original();

    /**
     * 此Json对象有几个节点
     * @return
     */
    int size();

    /**
     * 增加一个节点到Json对象
     * @param name
     * @param val
     * @return
     */
    Json append(String name, Object val);

    /**
     * 移除一个节点
     * @param name
     * @return
     */
    Json remove(String name);

    /**
     * 是否存在节点
     * @param name
     * @return
     */
    boolean isExist(String name);

    /**
     * 节点值是否等于{@code null}
     * @param name
     * @return
     */
    boolean isNull(String name);

    /**
     * 如果不存在返回默认值 false
     * @param name
     * @return
     */
    boolean booleanValue(String name);

    default Optional<Boolean> getBoolean(String name) {return null;}

    /**
     * 如果不存在返回默认值 0
     * @param name
     * @return
     */
    short shortValue(String name);

    /**
     * @param name
     * @return
     */
    Optional<Short> getShort(String name);

    /**
     * 如果不存在返回默认值 0
     * @param name
     * @return
     */
    int intValue(String name);

    /**
     * @param name 字段名
     * @return
     */
    Optional<Integer> getInt(String name);

    /**
     * 如果不存在返回默认值 0
     * @param name
     * @return
     */
    long longValue(String name);

    /**
     * @param name 字段名
     * @return
     */
    Optional<Long> getLong(String name);

    /**
     * 如果不存在返回默认值 0.0
     * @param name
     * @return
     */
    float floatValue(String name);

    /**
     * @param name 字段名
     * @return
     */
    Optional<Float> getFloat(String name);

    /**
     * 如果不存在返回默认值 0.00
     * @param name
     * @return
     */
    double doubleValue(String name);

    /**
     * @param name 字段名
     * @return
     */
    Optional<Double> getDouble(String name);

    Optional<BigDecimal> getBigDecimal(String name);

    Optional<Date> getDate(String name);

    <E extends Enum> E enumValue(String name, Class<E> clazz);

    <E extends Enum> Optional<E> getEnum(String name, Class<E> clazz);

    /**
     * @param name
     * @return
     */
    String stringValue(String name);

    /**
     * @param name 字段名
     * @return
     */
    Optional<String> getString(String name);

    <R> R toBean(Class<R> clazz);

    JsonArray toJsonArray();

    /**
     * @param name 字段名
     */
    Optional<Json> isJson(String name);

    /**
     * @param name 字段名
     */
    Optional<JsonArray> isJsonArray(String name);

    /**
     * 获取指定路径下面的节点
     * 分隔符：'/' 比如：/name/test
     * @param path
     * @return
     */
    <R> Optional<R> getPath(String path);

    /**
     * 返回一个json字符串
     * @return
     */
    String toJsonString();
}
